package org.example.day01;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO +
 * 疫情期间，需要大家保证一定的社交距离，公司组织开交流会议，
 * 座位有一排共N个座位，编号分别为[0.N-1]，要求员工一个接着一个进入会议室，并且可以在任何时候离开会议室。
 * 满足：每当一个员工进入时，需要坐到最大社交距离的座位
 * （例如：位置A与左右有员工落座的位置距离分别为2和2，位置B与左右有员工落座的位置距离分别为2和3，影响因素都为2个位置，则认为座位A和B与左右位置的社交距离是一样的）；
 * 如果有多个这样的座位，则坐到索引最小的那个座位。
 * @date 2024/3/11 15:22
 */
public class test005 {

    public static void main(String[] args) {
        int seatNum = 10;
        int[] seatOrLeave = {1, 0, 0, 0, 1, 0, 0, 0, 0, 1};

        System.out.println(assignSeats(seatNum, seatOrLeave));
    }

    public static int assignSeats(int seatNum, int[] seatOrLeave) {
        // 初始化座位为未占用状态，用0表示空闲，1表示占用
        int[] seats = new int[seatNum];
        int lastSeat = -1; // 初始化最后一个进入员工所占的座位

        for (int action : seatOrLeave) {
            if (action == 1) { // 员工进入会议室
                if (sum(seats) == 0) { // 如果是第一个进入的员工
                    seats[0] = 1;
                    lastSeat = 0;
                } else { // 如果不是第一个员工
                    int maxDistance = -1;
                    int seatIndex = 0;
                    for (int i = 0; i < seatNum; i++) {
                        if (seats[i] == 0) { // 找到一个空闲的座位
                            // 计算当前空座位到最近的已占用座位的最大距离
                            int distance = Integer.MAX_VALUE;
                            for (int j = 0; j < seatNum; j++) {
                                if (seats[j] == 1) {
                                    distance = Math.min(distance, Math.abs(i - j));
                                }
                            }
                            if (distance > maxDistance) { // 更新最大距离和最佳座位索引
                                maxDistance = distance;
                                seatIndex = i;
                            }
                        }
                    }
                    seats[seatIndex] = 1; // 占用这个座位
                    lastSeat = seatIndex;
                }
            } else { // 员工离开会议室
                int leaveSeat = Math.abs(action);
                seats[leaveSeat] = 0;
            }
        }
        return sum(seats) != seatNum ? lastSeat : -1; // 检查是否还有空座位
    }

    // 辅助方法：计算数组中1的总数，代表占用的座位数
    private static int sum(int[] array) {
        int sum = 0;
        for (int value : array) {
            sum += value;
        }
        return sum;
    }
}


